/*
 * txdnet.cn tonydon
 * by netbeans ide 7.2
 */
package cn.txdnet.txweb.basedao;

import java.security.InvalidParameterException;
import java.sql.Connection;

/**
 * 事务隔离级别
 *
 * @author tangxiaodong
 */
public enum TransIsoLevel {

    /**
     * 数据库驱动默认事务隔离级别
     */
    DEFAULT {
        /**
         * 返回: 0
         */
        @Override
        public int intValue() {
            return Connection.TRANSACTION_NONE;
        }
    },
    /**
     * 允许脏读、不可重复读和幻读
     */
    READ_UNCOMMITTED {
        /**
         * 返回: 1
         */
        @Override
        public int intValue() {
            return Connection.TRANSACTION_READ_UNCOMMITTED;
        }
    },
    /**
     * 禁止脏读，但允许不可重复读和幻读
     */
    READ_COMMITTED {
        /**
         * 返回: 2
         */
        @Override
        public int intValue() {
            return Connection.TRANSACTION_READ_COMMITTED;
        }
    },
    /**
     * 禁止脏读和不可重复读，但允许幻读
     */
    REPEATABLE_READ {
        /**
         * 返回: 4
         */
        @Override
        public int intValue() {
            return Connection.TRANSACTION_REPEATABLE_READ;
        }
    },
    /**
     * 禁止脏读、不可重复读和幻读
     */
    SERIALIZABLE {
        /**
         * 返回: 8
         */
        @Override
        public int intValue() {
            return Connection.TRANSACTION_SERIALIZABLE;
        }
    };

    /**
     * 事务隔离级别枚举对象转换为整数值
     */
    public abstract int intValue();

    /**
     * 整数值转换为事务隔离级别枚举对象
     *
     * @param level	<br>	: 0 - {@link TransIsoLevel#DEFAULT}<br> : 1 -
     * {@link TransIsoLevel#READ_UNCOMMITTED}<br> : 2 -
     * {@link TransIsoLevel#READ_COMMITTED}<br> : 4 -
     * {@link TransIsoLevel#REPEATABLE_READ}<br> : 8 -
     * {@link TransIsoLevel#SERIALIZABLE}<br>
     * @throws InvalidParameterException	: 找不到对应的事务隔离级别枚举对象时抛出异常
     *
     */
    public static final TransIsoLevel getLevel(int level) {
        for (TransIsoLevel lv : TransIsoLevel.values()) {
            if (lv.intValue() == level) {
                return lv;
            }
        }
        throw new InvalidParameterException("Invalid Parameter Value.");
    }
}
